"""
密码管理器主程序
"""
import os
import sys
from dotenv import load_dotenv
import pyperclip
from database import DatabaseManager

# 加载环境变量
load_dotenv()

class PasswordManager:
    """密码管理器类，处理用户界面和操作逻辑"""
    
    def __init__(self):
        """初始化密码管理器"""
        self.db_manager = DatabaseManager()
        if not self.db_manager.connect():
            print("无法连接到数据库，请检查配置。")
            sys.exit(1)
        
        # 确保数据库表存在
        self.db_manager.create_tables_if_not_exist()
    
    def display_menu(self):
        """显示主菜单"""
        print("\n===== 密码管理器 =====")
        print("1. 添加新密码")
        print("2. 查看所有平台")
        print("3. 查看特定平台的密码")
        print("4. 更新密码")
        print("5. 删除密码")
        print("6. 退出")
        print("=====================")
    
    def add_password(self):
        """添加新密码"""
        print("\n----- 添加新密码 -----")
        platform = input("平台名称: ")
        url = input("网址 (可选): ")
        username = input("用户名: ")
        password = input("密码: ")
        notes = input("备注 (可选): ")
        
        result = self.db_manager.add_password(platform, url, username, password, notes)
        if result:
            print("密码添加成功！")
        else:
            print("添加失败，可能该平台和用户名的组合已存在。")
    
    def view_all_platforms(self):
        """查看所有平台"""
        print("\n----- 所有平台 -----")
        try:
            platforms = self.db_manager.get_all_platforms()
            
            if not platforms:
                print("提示：数据库中没有保存的密码记录。")
                print("您可以选择选项1来添加新的密码记录。")
                return
            
            print("已保存的平台列表：")
            for i, platform in enumerate(platforms, 1):
                print(f"{i}. {platform}")
            
            print("\n总共找到 {} 个平台".format(len(platforms)))
        except Exception as e:
            print("查询平台列表时出错：")
            print(f"错误信息：{str(e)}")
            print("请检查数据库连接是否正常。")
    
    def view_platform_passwords(self):
        """查看特定平台的密码"""
        platform = input("\n输入平台名称: ")
        entries = self.db_manager.get_passwords_by_platform(platform)
        
        if not entries:
            print(f"未找到平台 '{platform}' 的密码。")
            return
        
        print(f"\n----- {platform} 的密码 -----")
        for i, entry in enumerate(entries, 1):
            print(f"{i}. 用户名: {entry['username']}")
            print(f"   URL: {entry['url'] or '未设置'}")
            print(f"   备注: {entry['notes'] or '无'}")
            print("   密码: *****")
            print()
        
        if len(entries) > 0:
            try:
                choice = int(input("输入编号查看密码 (0 返回): "))
                if 1 <= choice <= len(entries):
                    entry = entries[choice-1]
                    print(f"\n用户名: {entry['username']}")
                    print(f"密码: {entry['password']}")
                    
                    copy = input("复制密码到剪贴板? (y/n): ").lower()
                    if copy == 'y':
                        pyperclip.copy(entry['password'])
                        print("密码已复制到剪贴板！")
            except ValueError:
                print("无效的输入。")
    
    def update_password(self):
        """更新密码"""
        platform = input("\n输入平台名称: ")
        entries = self.db_manager.get_passwords_by_platform(platform)
        
        if not entries:
            print(f"未找到平台 '{platform}' 的密码。")
            return
        
        print(f"\n----- {platform} 的密码 -----")
        for i, entry in enumerate(entries, 1):
            print(f"{i}. 用户名: {entry['username']}")
        
        try:
            choice = int(input("输入要更新的编号 (0 返回): "))
            if 1 <= choice <= len(entries):
                entry = entries[choice-1]
                new_password = input("输入新密码: ")
                new_notes = input(f"输入新备注 (当前: {entry['notes'] or '无'}): ")
                
                update_data = {'password': new_password}
                if new_notes:
                    update_data['notes'] = new_notes
                
                if self.db_manager.update_password(entry['id'], update_data):
                    print("密码更新成功！")
                else:
                    print("更新失败。")
        except ValueError:
            print("无效的输入。")
    
    def delete_password(self):
        """删除密码"""
        platform = input("\n输入平台名称: ")
        entries = self.db_manager.get_passwords_by_platform(platform)
        
        if not entries:
            print(f"未找到平台 '{platform}' 的密码。")
            return
        
        print(f"\n----- {platform} 的密码 -----")
        for i, entry in enumerate(entries, 1):
            print(f"{i}. 用户名: {entry['username']}")
        
        try:
            choice = int(input("输入要删除的编号 (0 返回): "))
            if 1 <= choice <= len(entries):
                entry = entries[choice-1]
                confirm = input(f"确认删除 {platform} 的用户名 {entry['username']} 的密码? (y/n): ").lower()
                
                if confirm == 'y':
                    if self.db_manager.delete_password(entry['id']):
                        print("密码删除成功！")
                    else:
                        print("删除失败。")
        except ValueError:
            print("无效的输入。")
    
    def run(self):
        """运行密码管理器"""
        # 首次运行时检查数据库表内容
        platforms = self.db_manager.get_all_platforms()
        if not platforms:
            print("\n警告: 数据库中没有找到任何平台记录。")
            print("您需要先添加一些密码记录才能使用查看功能。")
        
        while True:
            self.display_menu()
            choice = input("请选择操作 (1-6): ")
            
            if choice == '1':
                self.add_password()
            elif choice == '2':
                self.view_all_platforms()
            elif choice == '3':
                self.view_platform_passwords()
            elif choice == '4':
                self.update_password()
            elif choice == '5':
                self.delete_password()
            elif choice == '6':
                print("\n感谢使用密码管理器！")
                self.db_manager.close()
                break
            else:
                print("无效的选择，请重试。")

if __name__ == "__main__":
    print("欢迎使用密码管理器！")
    
    # 检查环境变量是否已设置
    required_vars = ['DB_HOST', 'DB_USER', 'DB_PASSWORD', 'DB_NAME']
    missing_vars = [var for var in required_vars if not os.getenv(var)]
    
    if missing_vars:
        print("错误: 缺少以下环境变量:")
        for var in missing_vars:
            print(f"- {var}")
        print("\n请确保您已正确设置.env文件。")
        print("如果您是首次运行，请先执行setup.bat脚本。")
        sys.exit(1)
    
    # 启动密码管理器
    manager = PasswordManager()
    manager.run()